package org.putrpctorest.service.impl.spring;

import org.putrpctorest.resource.impl.MethodImpl;
import org.putrpctorest.service.impl.copy.ServiceInvokerImpl;
import org.putrpctorest.service.impl.copy.ServicesImpl;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

public class ServicesNamespaceParser extends AbstractBeanDefinitionParser {

    @Override
    protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {

        // ServicesImpl restServiceDefinitions = ResourcesParser.parse(element);
        //
        // AbstractBeanDefinition containerBd = createContainer(parserContext, restServiceDefinitions);
        //
        // createAndRegisterServiceClassAndObject(parserContext, restServiceDefinitions);
        //
        // createAndRegisterServiceInvoker(parserContext, restServiceDefinitions);
        //
        // for (ResourceImpl resource : restServiceDefinitions.getResources()) {
        //
        // for (MethodImpl method : resource.getMethods()) {
        //
        // createAndRegisterMethodBeanDefinition(parserContext, method);
        //
        // }
        // }

        // return containerBd;
        return null;

    }

    private void createAndRegisterServiceInvoker(ParserContext parserContext, ServicesImpl restServiceDefinitions) {

        BeanDefinition serviceInovkerBeanDefinition = BeanDefinitionBuilder
                .rootBeanDefinition(ServiceInvokerImpl.class)
                .addConstructorArgReference(restServiceDefinitions.getId()).getBeanDefinition();

        parserContext.getRegistry().registerBeanDefinition(restServiceDefinitions.getId() + ".serviceInvoker",
                serviceInovkerBeanDefinition);

    }

    private void createAndRegisterServiceClassAndObject(ParserContext parserContext, ServicesImpl restServiceDefinitions) {

        // ServiceClassGenerator serviceClassGenerator = new JavassistServiceClassGenerator();
        // Class<?> serviceClass = serviceClassGenerator.generateClass(restServiceDefinitions);
        //
        // BeanDefinitionBuilder serviceClassBd =
        // BeanDefinitionBuilder.rootBeanDefinition(ServiceClassFactoryBean.class);
        // serviceClassBd.addConstructorArgValue(serviceClass);
        //
        // parserContext.getRegistry().registerBeanDefinition(restServiceDefinitions.getId() + ".serviceClass",
        // serviceClassBd.getBeanDefinition());
        //
        // BeanDefinition serviceObjectBd = BeanDefinitionBuilder.rootBeanDefinition(serviceClass)
        // .addConstructorArgReference(restServiceDefinitions.getId()).getBeanDefinition();
        //
        // parserContext.getRegistry().registerBeanDefinition(restServiceDefinitions.getId() + ".serviceObject",
        // serviceObjectBd);

    }

    private AbstractBeanDefinition createContainer(ParserContext parserContext, ServicesImpl servicesDefinitions) {
        return BeanDefinitionBuilder.rootBeanDefinition(SpringContainer.class)
                .addConstructorArgValue(servicesDefinitions.getId()).addPropertyValue("services", servicesDefinitions)
                .getBeanDefinition();

    }

    private void createAndRegisterMethodBeanDefinition(ParserContext parserContext, MethodImpl method) {
        BeanDefinition methodBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(MethodFactoryBean.class)
                .addConstructorArgValue(method).getBeanDefinition();

        // parserContext.getRegistry().registerBeanDefinition(method.getName(), methodBeanDefinition);
    }

}
